package service

import (
	"context"

	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gtime"

	"goldtree/internal/dao"
	"goldtree/internal/entity"
	"goldtree/utility/crypto"
)

// InitService 初始化服务
type InitService struct{}

var Init = InitService{}

// CreateDefaultAdmin 创建默认管理员账户
func (s *InitService) CreateDefaultAdmin(ctx context.Context) error {
	// 检查是否已存在管理员账户
	adminExists, err := dao.User.GetCount(ctx, "role = ?", "admin")
	if err != nil {
		return gerror.Wrap(err, "检查管理员账户失败")
	}

	if adminExists > 0 {
		g.Log().Info(ctx, "管理员账户已存在，跳过创建")
		return nil
	}

	// 默认管理员信息
	defaultAdmin := map[string]string{
		"username": "admin",
		"password": "admin123",
		"email":    "admin@goldtree.com",
		"nickname": "系统管理员",
	}

	// 检查用户名是否已存在
	exists, err := dao.User.IsUsernameExists(ctx, defaultAdmin["username"])
	if err != nil {
		return gerror.Wrap(err, "检查用户名失败")
	}
	if exists {
		g.Log().Warning(ctx, "管理员用户名已存在，跳过创建")
		return nil
	}

	// 加密密码
	hashedPassword, err := crypto.GeneratePasswordHash(defaultAdmin["password"])
	if err != nil {
		return gerror.Wrap(err, "密码加密失败")
	}

	// 创建管理员用户
	admin := &entity.User{
		Username:  defaultAdmin["username"],
		Password:  hashedPassword,
		Email:     defaultAdmin["email"],
		Nickname:  defaultAdmin["nickname"],
		Role:      "admin",
		Status:    "active",
		CreatedAt: gtime.Now(),
		UpdatedAt: gtime.Now(),
	}

	adminId, err := dao.User.Insert(ctx, admin)
	if err != nil {
		return gerror.Wrap(err, "创建管理员账户失败")
	}

	g.Log().Info(ctx, "默认管理员账户创建成功",
		"admin_id", adminId,
		"username", defaultAdmin["username"],
		"password", defaultAdmin["password"],
		"email", defaultAdmin["email"])

	return nil
}

// InitializeSystem 初始化系统
func (s *InitService) InitializeSystem(ctx context.Context) error {
	g.Log().Info(ctx, "开始初始化系统...")

	// 创建默认管理员账户
	if err := s.CreateDefaultAdmin(ctx); err != nil {
		return gerror.Wrap(err, "创建默认管理员失败")
	}

	// 清理过期令牌
	if err := dao.UserToken.CleanExpiredTokens(ctx); err != nil {
		g.Log().Warning(ctx, "清理过期令牌失败", "error", err)
	}

	g.Log().Info(ctx, "系统初始化完成")

	return nil
}
